package vip.xiaonuo.biz.modular.lancerBrand.service.impl;

import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
import vip.xiaonuo.biz.modular.lancerFile.FileService;
import vip.xiaonuo.common.pojo.DbEnum;
import vip.xiaonuo.biz.modular.pojo.domain.BizBrand;
import vip.xiaonuo.biz.modular.lancerBrand.service.BizBrandService;
import vip.xiaonuo.biz.modular.mapper.BizBrandMapper;
import org.springframework.stereotype.Service;
import vip.xiaonuo.biz.modular.pojo.dto.add.BrandAddDTO;
import vip.xiaonuo.biz.modular.pojo.dto.common.CommonDeleteDTO;
import vip.xiaonuo.biz.modular.pojo.dto.common.CommonDetailDTO;
import vip.xiaonuo.biz.modular.pojo.dto.edit.BrandEditDTO;
import vip.xiaonuo.biz.modular.pojo.dto.edit.BrandEditStatusDTO;
import vip.xiaonuo.biz.modular.pojo.dto.page.BrandPageDTO;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.page.CommonPageRequest;
import vip.xiaonuo.dev.modular.file.provider.DevFileApiProvider;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author LancerAdmin
 * @description 针对表【biz_brand(品牌信息)】的数据库操作Service实现
 * @createDate 2024-02-29 14:54:24
 */
@Service
public class BizBrandServiceImpl extends ServiceImpl<BizBrandMapper, BizBrand>
        implements BizBrandService {

    @Override
    public Page<BizBrand> pageL(BrandPageDTO dto) {
        LambdaQueryWrapper<BizBrand> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper
                .eq(ObjectUtil.isNotEmpty(dto.getBrandStatus()),
                        BizBrand::getBrandStatus,
                        dto.getBrandStatus())
                .like(ObjectUtil.isNotEmpty(dto.getBrandName()),
                        BizBrand::getBrandName,
                        dto.getBrandName())
                .like(ObjectUtil.isNotEmpty(dto.getBrandDesc()),
                        BizBrand::getBrandDesc,
                        dto.getBrandDesc())

                .orderByDesc(BizBrand::getCreateTime);

        return this.page(CommonPageRequest.defaultPage(), queryWrapper);

    }
    @Override
    public BizBrand getBrandByUserId() {
        String brandId = StpLoginUserUtil.getLoginUser().getId();
        return detail(new CommonDetailDTO(brandId));
    }



    @Override
    public BizBrand detail(CommonDetailDTO dto) {
        return this.getById(dto.getId());
    }
    @Resource
    private DevFileApiProvider devFileApi;
    @Override
    public void add(BrandAddDTO dto) {

        String brandStatus = dto.getBrandStatus();
        DbEnum.BrandStatus.validate(brandStatus);


        BizBrand brand = new BizBrand();
        // 上传到minio
        String minioWordUrl = devFileApi.storageFileWithReturnUrlMinio(dto.getImgUrl());
        brand.setImgUrl(minioWordUrl);
        brand
                .setBrandName(dto.getBrandName())
                .setBrandDesc(dto.getBrandDesc())
                .setSort(dto.getSort())
                .setFirstLetter(dto.getFirstLetter())
                .setBrandStatus(DbEnum.BrandStatus.NORMAL.getValue());
        this.save(brand);
    }

    @Override
    @Transactional
    public void delete(List<CommonDeleteDTO> dto) {
        List<String> idList = CollStreamUtil.toList(dto, CommonDeleteDTO::getId);
        // 删除类型
        this.removeBatchByIds(idList);

    }

    @Autowired
    FileService fileService;

    @Override
    public void edit(BrandEditDTO dto) {
        if (ObjectUtil.isEmpty(this.getById(dto.getId()))) {
            throw new CommonException("当前品牌id不存在！");
        }
        String isChangeImg = dto.getIsChangeImg();
        DbEnum.YOrN.validate(isChangeImg);

        String brandStatus = dto.getBrandStatus();
        DbEnum.BrandStatus.validate(brandStatus);
        BizBrand brand = new BizBrand();
        brand.setId(dto.getId())
                .setFirstLetter(dto.getFirstLetter())
                .setBrandName(dto.getBrandName())
                .setBrandDesc(dto.getBrandDesc())
                .setSort(dto.getSort())
                .setBrandStatus(brandStatus);
        // 是否上传新的头像
        if (DbEnum.YOrN.YES.getValue().equals(isChangeImg)) {
            // 上传到minio
            String minioWordUrl = devFileApi.storageFileWithReturnUrlMinio(dto.getImgUrl());
            brand.setImgUrl(minioWordUrl);
        }
        this.updateById(brand);
    }
    @Override
    public void editBus(BrandEditDTO dto) {
        if (ObjectUtil.isEmpty(this.getById(dto.getId()))) {
            throw new CommonException("当前品牌id不存在！");
        }
        String isChangeImg = dto.getIsChangeImg();
        DbEnum.YOrN.validate(isChangeImg);

        BizBrand brand = new BizBrand();
        brand.setId(dto.getId())
                .setFirstLetter(dto.getFirstLetter())
                .setBrandName(dto.getBrandName())
                .setBrandDesc(dto.getBrandDesc())
                .setSort(dto.getSort());
        // 是否上传新的头像
        if (DbEnum.YOrN.YES.getValue().equals(isChangeImg)) {
            // 上传到minio
            String minioWordUrl = devFileApi.storageFileWithReturnUrlMinio(dto.getImgUrl());
            brand.setImgUrl(minioWordUrl);
        }
        this.updateById(brand);
    }
    @Override
    public void editStatus(BrandEditStatusDTO dto) {
        String brandStatus = dto.getBrandStatus();
        DbEnum.BrandStatus.validate(brandStatus);
        BizBrand brand = new BizBrand();
        brand.setId(dto.getId()).setBrandStatus(brandStatus);
        this.updateById(brand);
    }

    @Override
    public String getBrandNameByUserId() {
        String userId = StpLoginUserUtil.getLoginUser().getId();
        LambdaQueryWrapper<BizBrand> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(BizBrand::getBrandName)
                .eq(BizBrand::getId, userId);
        try
        {
            BizBrand one = this.getOne(queryWrapper);
            return one.getBrandName();

        }
        catch (Exception e){
            throw new CommonException("当前用户没有品牌信息，操作失败！");
        }

    }
}